while (n--)
{
double luminance = *(double *) src[0];
- double alpha = *(double *) src[1];
-
- if (alpha > BABL_ALPHA_THRESHOLD)
- {
- luminance = luminance / alpha;
- }
+ double alpha;
+ alpha = *(double *) src[1];
+ if (alpha == 0)
+ luminance = 0;
else
- {
- luminance = 0.0;
- }
+ {
+ luminance = luminance / alpha;
+ if (alpha == BABL_ALPHA_FLOOR)
+ alpha = 0.0;
+ }
*(double *) dst[0] = luminance;
*(double *) dst[1] = luminance;
double red = *(double *) src[0];
double green = *(double *) src[1];
double blue = *(double *) src[2];
- double alpha = *(double *) src[3];
double luminance;
+ double alpha, alpha_used;
+ alpha_used = alpha = *(double *) src[3];
+ if (alpha < BABL_ALPHA_FLOOR)
+ alpha_used = BABL_ALPHA_FLOOR;
luminance = red * RGB_LUMINANCE_RED +
green * RGB_LUMINANCE_GREEN +
blue * RGB_LUMINANCE_BLUE;
- luminance *= alpha;
+ luminance *= alpha_used;
*(double *) dst[0] = luminance;
- *(double *) dst[1] = alpha;
+ *(double *) dst[1] = alpha_used;
BABL_PLANAR_STEP
}
}
while (n--)
{
- double alpha;
int band;
+ double alpha, alpha_used;
+
+ alpha_used = alpha = *(double *) src[src_bands-1];
+ if (alpha < BABL_ALPHA_FLOOR)
+ alpha_used = BABL_ALPHA_FLOOR;
- alpha = *(double *) src[src_bands - 1];
for (band = 0; band < src_bands - 1; band++)
{
- *(double *) dst[band] = *(double *) src[band] * alpha;
+ *(double *) dst[band] = *(double *) src[band] * alpha_used;
}
- *(double *) dst[dst_bands - 1] = alpha;
+ *(double *) dst[dst_bands - 1] = alpha_used;
BABL_PLANAR_STEP
}
while (n--)
{
- double alpha;
int band;
+ double alpha;
+ alpha = *(double *) src[src_bands-1];
- alpha = *(double *) src[src_bands - 1];
for (band = 0; band < src_bands - 1; band++)
{
- if (alpha > BABL_ALPHA_THRESHOLD)
- {
- *(double *) dst[band] = *(double *) src[band] / alpha;
- }
+ if (alpha == 0.0)
+ *(double *) dst[band] = 0;
else
- {
- *(double *) dst[band] = 0.0;
- }
+ *(double *) dst[band] = *(double *) src[band] / alpha;
}
+ if (alpha == BABL_ALPHA_FLOOR)
+ alpha = 0.0;
*(double *) dst[dst_bands - 1] = alpha;
BABL_PLANAR_STEP
double red = ((double *) src)[0];
double green = ((double *) src)[1];
double blue = ((double *) src)[2];
- double alpha = ((double *) src)[3];
-
double luminance;
double luma;
+ double alpha, alpha_used;
+ alpha_used = alpha = ((double *) src)[3];
+ if (alpha < BABL_ALPHA_FLOOR)
+ alpha_used = BABL_ALPHA_FLOOR;
luminance = red * RGB_LUMINANCE_RED +
green * RGB_LUMINANCE_GREEN +
blue * RGB_LUMINANCE_BLUE;
luma = babl_trc_from_linear (trc, luminance);
- ((double *) dst)[0] = luma * alpha;
- ((double *) dst)[1] = alpha;
+ ((double *) dst)[0] = luma * alpha_used;
+ ((double *) dst)[1] = alpha_used;
src += 4 * sizeof (double);
dst += 2 * sizeof (double);
while (n--)
{
double luma = ((double *) src)[0];
- double alpha = ((double *) src)[1];
double luminance;
-
- if (alpha > BABL_ALPHA_THRESHOLD)
- luma = luma / alpha;
+ double alpha;
+ alpha = ((double *) src)[1];
+ if (alpha == 0.0)
+ luma = 0.0;
else
- luma = 0.0;
+ luma = luma / alpha;
luminance = babl_trc_to_linear (trc, luma);
+ if (alpha == BABL_ALPHA_FLOOR)
+ alpha = 0.0;
+
((double *) dst)[0] = luminance;
((double *) dst)[1] = luminance;
((double *) dst)[2] = luminance;
}
}
+
static void
non_premultiplied_to_premultiplied (Babl *conversion,
int src_bands,
while (n--)
{
double alpha;
+ double alpha_used;
int band;
- alpha = *(double *) src[src_bands - 1];
+ alpha_used = alpha = *(double *) src[src_bands - 1];
+ if (alpha < BABL_ALPHA_FLOOR)
+ alpha_used = BABL_ALPHA_FLOOR;
+
for (band = 0; band < src_bands - 1; band++)
{
- *(double *) dst[band] = *(double *) src[band] * alpha;
+ *(double *) dst[band] = *(double *) src[band] * alpha_used;
}
- *(double *) dst[dst_bands - 1] = alpha;
+ *(double *) dst[dst_bands - 1] = alpha_used;
BABL_PLANAR_STEP
}
while (n--)
{
double alpha;
+ double recip_alpha;
int band;
alpha = *(double *) src[src_bands - 1];
- if (alpha > BABL_ALPHA_THRESHOLD)
- {
- double recip_alpha = 1.0 / alpha;
- for (band = 0; band < src_bands - 1; band++)
- *(double *) dst[band] = *(double *) src[band] * recip_alpha;
- }
+ if (alpha == 0.0)
+ recip_alpha = 0.0;
else
- {
- for (band = 0; band < src_bands - 1; band++)
- *(double *) dst[band] = 0.0;
- }
+ {
+ recip_alpha = 1.0 / alpha;
+ if (alpha == BABL_ALPHA_FLOOR)
+ alpha = 0.0; // making 0 round-trip to zero, causing discontinuity
+ }
+
+ for (band = 0; band < src_bands - 1; band++)
+ *(double *) dst[band] = *(double *) src[band] * recip_alpha;
*(double *) dst[dst_bands - 1] = alpha;
BABL_PLANAR_STEP
while (n--)
{
- double alpha = ((double *) src)[3];
- ((double *) dst)[0] = babl_trc_from_linear (trc[0], ((double *) src)[0]) * alpha;
- ((double *) dst)[1] = babl_trc_from_linear (trc[1], ((double *) src)[1]) * alpha;
- ((double *) dst)[2] = babl_trc_from_linear (trc[2], ((double *) src)[2]) * alpha;
- ((double *) dst)[3] = alpha;
+ double alpha, alpha_used;
+ alpha_used = alpha = ((double *) src)[3];
+ if (alpha < BABL_ALPHA_FLOOR)
+ alpha_used = BABL_ALPHA_FLOOR;
+ ((double *) dst)[0] = babl_trc_from_linear (trc[0], ((double *) src)[0]) * alpha_used;
+ ((double *) dst)[1] = babl_trc_from_linear (trc[1], ((double *) src)[1]) * alpha_used;
+ ((double *) dst)[2] = babl_trc_from_linear (trc[2], ((double *) src)[2]) * alpha_used;
+ ((double *) dst)[3] = alpha_used;
src += 4 * sizeof (double);
dst += 4 * sizeof (double);
}
while (n--)
{
- double alpha = ((double *) src)[3];
- if (alpha > BABL_ALPHA_THRESHOLD)
- {
+ double alpha;
+ alpha = ((double *) src)[3];
+ if (alpha == 0)
+ {
+ ((double *) dst)[0] = 0;
+ ((double *) dst)[1] = 0;
+ ((double *) dst)[2] = 0;
+ }
+ else
+ {
((double *) dst)[0] = babl_trc_to_linear (trc[0], ((double *) src)[0] / alpha);
((double *) dst)[1] = babl_trc_to_linear (trc[1], ((double *) src)[1] / alpha);
((double *) dst)[2] = babl_trc_to_linear (trc[2], ((double *) src)[2] / alpha);
- }
- else
- {
- ((double *) dst)[0] = 0.0;
- ((double *) dst)[1] = 0.0;
- ((double *) dst)[2] = 0.0;
- }
+ if (alpha == BABL_ALPHA_FLOOR)
+ alpha = 0;
+ }
((double *) dst)[3] = alpha;
src += 4 * sizeof (double);
while (n--)
{
- double alpha = ((double *) src)[3];
- ((double *) dst)[0] = babl_trc_from_linear (trc, ((double *) src)[0]) * alpha;
- ((double *) dst)[1] = babl_trc_from_linear (trc, ((double *) src)[1]) * alpha;
- ((double *) dst)[2] = babl_trc_from_linear (trc, ((double *) src)[2]) * alpha;
- ((double *) dst)[3] = alpha;
+ double alpha, alpha_used;
+ alpha_used = alpha = ((double *) src)[3];
+ if (alpha < BABL_ALPHA_FLOOR)
+ alpha_used = BABL_ALPHA_FLOOR;
+ ((double *) dst)[0] = babl_trc_from_linear (trc, ((double *) src)[0]) * alpha_used;
+ ((double *) dst)[1] = babl_trc_from_linear (trc, ((double *) src)[1]) * alpha_used;
+ ((double *) dst)[2] = babl_trc_from_linear (trc, ((double *) src)[2]) * alpha_used;
+ ((double *) dst)[3] = alpha_used;
src += 4 * sizeof (double);
dst += 4 * sizeof (double);
}
static void
rgba_perceptual_premultiplied2rgba (Babl *conversion,
- char *src,
- char *dst,
- long samples)
+ char *src,
+ char *dst,
+ long samples)
{
const Babl *trc = perceptual_trc;
long n = samples;
while (n--)
{
- double alpha = ((double *) src)[3];
- if (alpha > BABL_ALPHA_THRESHOLD)
- {
- ((double *) dst)[0] = babl_trc_to_linear (trc, ((double *) src)[0] / alpha);
- ((double *) dst)[1] = babl_trc_to_linear (trc, ((double *) src)[1] / alpha);
- ((double *) dst)[2] = babl_trc_to_linear (trc, ((double *) src)[2] / alpha);
- }
+ double alpha;
+ alpha = ((double *) src)[3];
+ if (alpha == 0)
+ {
+ ((double *) dst)[0] = 0;
+ ((double *) dst)[1] = 0;
+ ((double *) dst)[2] = 0;
+ }
else
- {
- ((double *) dst)[0] = 0.0;
- ((double *) dst)[1] = 0.0;
- ((double *) dst)[2] = 0.0;
- }
+ {
+ ((double *) dst)[0] = babl_trc_to_linear (trc, ((double *) src)[0] / alpha);
+ ((double *) dst)[1] = babl_trc_to_linear (trc, ((double *) src)[1] / alpha);
+ ((double *) dst)[2] = babl_trc_to_linear (trc, ((double *) src)[2] / alpha);
+ if (alpha == BABL_ALPHA_FLOOR)
+ alpha = 0.0;
+ }
((double *) dst)[3] = alpha;
src += 4 * sizeof (double);